<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // 1 函数数据类型的创建  

        function test1(){
            return 666;
        }

        //在堆内存开辟一个空间 然后把代码一模一样复制进去 
        //在栈内存也开辟一个空间  把函数的名字放进去 
        // 把堆内存的地址 给到栈内存 函数名所在的空间  

        // 函数创建 占据了空间  

        // var obj = {
        //     sing:function(){
        //         return 1
        //     },
        //     eat: function(){
        //         return 2
        //     }
        // }

        //上面对象内部 两个函数  所以两个空间 

        // function outer(){
        //     // 定义的时候 inner 还没有开辟空间  调用就开辟空间了  
        //     function inner(){
        //         return 1;
        //     }
        //     return inner
        // }

        // // outer()  // inner 
        // outer()() // inner()


        // 因为定义阶段  函数内部的函数没有开辟空间 
        // 调用的时候开辟空间  

        // 所以 就是 每调用一次 开辟一次  



        function Person(name){
            this.name = name
            this.talk = function(){  //把一个函数 赋值给了 新对象的talk 
                return `开口说话`
            }
        }
        // 内部新建一个函数  给到这个obj1对象的talk 
        var obj1 = new Person('张三');

         // 内部新建一个函数  给到这个obj2对象的talk 
        var obj2 = new Person('李四');

        // alert(obj1.talk === obj2.talk);

        console.log(obj1,obj2);






    </script>
</body>
</html>